package com.zhixing.reward.controller;

import com.zhixing.common.annotation.Passenger;
import com.zhixing.common.domain.entity.CouponUseInfo;
import com.zhixing.common.exception.ZhixingException;
import com.zhixing.common.utils.Res;
import com.zhixing.common.utils.UserContext;
import com.zhixing.reward.domain.dto.QueryParams;
import com.zhixing.reward.domain.vo.CouponRecordVO;
import com.zhixing.reward.domain.vo.CouponVO;
import com.zhixing.reward.service.CouponService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.util.List;
import static com.zhixing.common.domain.enums.HttpStatus.AMOUNT_NOT_LEGAL;

/**
 * 优惠券接口
 */
@Slf4j
@RestController
@RequestMapping("/coupon")
@RequiredArgsConstructor
public class CouponController {

    private final CouponService couponService;

    /**
     * 获取首页优惠券
     * @return List<CouponVO> 首页优惠券
     */
    @Passenger
    @GetMapping("/homePage")
    public Res<List<CouponVO>> getHomePageCoupon() {
        Integer userId = UserContext.getUserInfo().getId();
        log.info("奖励服务调用，获取首页优惠券，用户id：{}", userId);
        return Res.ok(couponService.getHomePageCoupon(userId));
    }

    /**
     * 领取首页优惠券
     * @param couponId 优惠券id
     * @return 操作结果
     */
    @Passenger
    @PostMapping("/receive/{couponId}")
    public Res<Void> receiveCoupon(@PathVariable Integer couponId) {
        Integer userId = UserContext.getUserInfo().getId();
        log.info("奖励服务调用，领取首页优惠券，用户id：{}", userId);
        couponService.receiveCoupon(userId, couponId);
        return Res.ok();
    }

    /**
     * 获取未使用优惠券
     * @return List<CouponRecordVO> 未使用优惠券
     */
    @Passenger
    @GetMapping("/unused")
    public Res<List<CouponRecordVO>> getUnusedCoupon() {
        Integer userId = UserContext.getUserInfo().getId();
        log.info("奖励服务调用，获取未使用优惠券，用户id：{}", userId);
        return Res.ok(couponService.getUnusedCoupon(userId));
    }

    /**
     * 分页获取已失效优惠券
     * @param queryParams 分页参数
     * @return List<CouponRecordVO> 已失效优惠券
     */
    @Passenger
    @GetMapping("/invalid")
    public Res<List<CouponRecordVO>> getInvalidCouponByPage(QueryParams queryParams) {
        Integer userId = UserContext.getUserInfo().getId();
        log.info("奖励服务调用，获取已失效优惠券，用户id：{}", userId);
        return Res.ok(couponService.getInvalidCouponByPage(userId, queryParams));
    }

    /**
     * 根据金额获取可使用优惠券
     * @param amount 金额
     * @return List<CouponRecordVO> 可使用优惠券
     */
    @Passenger
    @GetMapping("/canUse/{amount}")
    public Res<List<CouponRecordVO>> getCanUseCouponByAmount(@PathVariable BigDecimal amount) {
        if (amount.compareTo(BigDecimal.ZERO) <= 0 || amount.stripTrailingZeros().scale() > 2) throw new ZhixingException(AMOUNT_NOT_LEGAL);
        Integer userId = UserContext.getUserInfo().getId();
        log.info("奖励服务调用，根据金额获取可使用优惠券，用户id：{}", userId);
        return Res.ok(couponService.getCanUseCouponByAmount(userId, amount));
    }

    /**
     * 根据id获取优惠券使用信息
     * @param couponId 优惠券id
     * @return Coupon 优惠券使用信息
     */
    @Passenger
    @GetMapping("/{couponId}")
    public Res<CouponUseInfo> getCouponUseInfoById(@PathVariable Integer couponId) {
        Integer userId = UserContext.getUserInfo().getId();
        log.info("奖励服务调用，根据id获取优惠券使用信息，用户id：{}，优惠券id：{}", userId, couponId);
        return Res.ok(couponService.getCouponUseInfoById(couponId, userId));
    }

    /**
     * 使用优惠券
     * @param couponId 优惠券id
     * @return 操作结果
     */
    @Passenger
    @PutMapping("/use/{couponId}")
    public Res<Void> useCoupon(@PathVariable Integer couponId) {
        Integer userId = UserContext.getUserInfo().getId();
        log.info("奖励服务调用，使用优惠券，用户id：{}，优惠券id：{}", userId, couponId);
        couponService.useCoupon(couponId, userId);
        return Res.ok();
    }
}
